﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Data.SqlClient;
using System.Globalization;
using TratamentoRIWikipedia.processamento;
using System.Collections;
using System.IO;

namespace TratamentoRIWikipedia.modelagem
{
    class ModelagemGeral
    {

        /// <summary>
        /// Recebe um id ou list documento para busca o texto na memoria secundaria 
        /// </summary>
        /// <param name="idDocumento">Id do documento buscado</param>
        /// <returns>Arraylist com titulo e texto do documento</returns>
        public static Dictionary<string, string> BuscaExibeDocMemoria(List<int> idDocumentos)
        {
            StreamReader streamTexto = new StreamReader("WikiDoc01.txt");//WikiDoc02.txt texto sem tratamento
            Dictionary<string, string> documentoBuscado = new Dictionary<string, string>();
            string[] termos;

            int contador = 0;
            try
            {
                //lendo a linha do indice
                string LinhaTxt = streamTexto.ReadLine();
                while (LinhaTxt != null && idDocumentos.Count > contador)
                {
                    string[] separador = new string[] { "<#title#>", "<#id#>", "<#text#>" };
                    termos = LinhaTxt.Split(separador, StringSplitOptions.RemoveEmptyEntries);

                    string documento = termos[1]; //Pega id do documento

                    //Se Id igual a do Procurado adiciona no arraylist e exibe
                    if (int.Parse(termos[1]) == idDocumentos[contador])
                    {
                        documentoBuscado.Add(termos[0].ToUpper(), termos[2].ToString());
                        contador++;
                    }

                    //lendo nova linha 
                    LinhaTxt = streamTexto.ReadLine();

                }
            }
            catch (Exception e)
            {
                throw e;
            }

            return documentoBuscado;

        }


        /// <summary>
        /// Recebe um id e recupera documento da memoria
        /// </summary>
        /// <param name="idDocumento">Id do documento buscado</param>
        /// <returns>Arraylist com titulo e texto do documento</returns>
        public static Dictionary<string, string> BuscaDocMemoria(int idDocumentos)
        {
            StreamReader streamTexto = new StreamReader("WikiDoc01.txt");//WikiDoc02.txt texto sem tratamento
            Dictionary<string, string> documentoBuscado = new Dictionary<string, string>();

            string[] termos;

            try
            {
                //lendo a linha do indice
                string LinhaTxt = streamTexto.ReadLine();
                while (LinhaTxt != null)
                {
                    string[] separador = new string[] { "<#title#>", "<#id#>", "<#text#>" };
                    termos = LinhaTxt.Split(separador, StringSplitOptions.RemoveEmptyEntries);

                    string documento = termos[1]; //Pega id do documento

                    //Se Id igual a do Procurado adiciona no arraylist e exibe
                    if (int.Parse(termos[1]) == idDocumentos)
                    {
                        documentoBuscado.Add(termos[0].ToUpper(), termos[2].ToString());
                    }

                    //lendo nova linha 
                    LinhaTxt = streamTexto.ReadLine();

                }
            }
            catch (Exception e)
            {
                throw e;
            }

            return documentoBuscado;
        }


        public static Dictionary<string, List<int>> LerIndiceMemoria()
        {

            Dictionary<string, List<int>> itensIndice = new Dictionary<string, List<int>>(); //no máximo mil
            StreamReader streamIndice = new StreamReader("Indice.txt");
            List<int> listaValor = new List<int>();

            try
            {
                //lendo a linha do indice
                string LinhaTxt = streamIndice.ReadLine();

                while (LinhaTxt != null)
                {

                    string[] stringSeparators = new string[] { "|" }; //"<#separador#>",
                    ArrayList palavras = new ArrayList(LinhaTxt.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries));

                    for (int i = 1; i < palavras.Count; i++)
                    {
                        string[] separador = new string[] { "(", ")", "," };
                        string[] informaTermo = palavras[i].ToString().Split(separador, StringSplitOptions.RemoveEmptyEntries);
                        listaValor.Add(int.Parse(informaTermo[0]));
                    }

                    itensIndice.Add((string)palavras[0], listaValor);//adiciona no hash 
                    listaValor = new List<int>();

                    //lendo a linha 
                    LinhaTxt = streamIndice.ReadLine();
                }

            }
            catch (Exception e)
            {
                throw e;
            }

            return itensIndice;

        }

        /// <summary>
        /// Ler Indice Com frequencia do termo para o documento
        /// </summary>
        /// <returns></returns>
        public static Dictionary<string, ArrayList> LerIndiceMemoriaFrequencia(out int totalDeDocs)
        {

            Dictionary<string, ArrayList> itensIndice = new Dictionary<string, ArrayList>(); //no máximo mil
            StreamReader streamIndice = new StreamReader("Indice.txt");
            ArrayList listaValor = new ArrayList();
            totalDeDocs = 0;

            try
            {
                //lendo a linha do indice
                string LinhaTxt = streamIndice.ReadLine();

                while (LinhaTxt != null)
                {
                    totalDeDocs++;

                    string[] stringSeparators = new string[] { "|" }; //"<#separador#>",
                    ArrayList palavras = new ArrayList(LinhaTxt.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries));

                    for (int i = 1; i < palavras.Count; i++)
                    {
                        listaValor.Add(palavras[i]);
                    }

                    itensIndice.Add((string)palavras[0], listaValor);//adiciona no hash 
                    listaValor = new ArrayList();

                    //lendo a linha 
                    LinhaTxt = streamIndice.ReadLine();
                }

            }
            catch (Exception e)
            {
                throw e;
            }

            return itensIndice;

        }


        public static string preProcessaConsulta(string TextoBuscado, out bool buscaOR, out ArrayList itensDaBusca)
        {
            buscaOR = false;

            //Processamento da texto da busca
            string[] stringSeparators = new string[] { " " };
            //split com a string acima 
            itensDaBusca = new ArrayList(TextoBuscado.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries));

            if (itensDaBusca.Contains("OR"))
            {
                buscaOR = true;
                itensDaBusca.RemoveAt(itensDaBusca.IndexOf("OR"));
            }

            TextoBuscado = AnaliseLexica.RemoveAcentos(TextoBuscado);
            TextoBuscado = AnaliseLexica.RemoveCaracterEspecial(TextoBuscado);

            return TextoBuscado;
        }
    }
}
